package com.tensquare.qa.interceptor;

/**
 * @BelongsProject: tensquare_parent
 * @BelongsPackage: com.tensquare.user.interceptor
 * @Author: yang
 * @CreateTime: 2019-03-12 14:26
 * @Description: ${Description}
 */

import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import util.JwtUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * jwt 拦截器
 */

@Component  //注册容器
public class JwtInterceptor implements HandlerInterceptor {

    @Autowired
    private JwtUtil jwtUtil;

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("经过了拦截器");

        //首先要确定 无论如何都要放行，具体能不能操作还是在具体的操作中判断
        //拦截器只是负责把把请求头中包含token的令牌进行解析验证

        /**
         *
         * 如果有头 就拦截进行处理 没有头 就放行
         * 这里其实拦截到的信息并没有不放行 只是重新处理 往request里面放值
         */
        String header=request.getHeader("Authorization"); //由公司内部定义的头里面存放token 的字段 比如这里定义头里的信息为 Authorisation: Bearer + 空格 + token
        if(header!=null &&!"".equals(header)){
            //如果包含有头信息，就对其进行解析
            if(header.startsWith("Bearer ")){
                //得到token
                String token=header.substring(7);
                //对令牌进行解析
                /**
                 * 下面用到try catch 是因为 虽然不会提示需要抓住异常 但是如果超过过期时间 程序就要抛异常
                 * 所以这里要先try catch住这个异常
                 */
                try{
                    //判断roles是否是admin
                    Claims claims=jwtUtil.parseJWT(token);
                    String roles = (String) claims.get("roles");
                    if(roles!=null||roles.equals("admin")){
                        request.setAttribute("claims_admin",token);
                    }
                    if(roles!=null||roles.equals("user")){
                        request.setAttribute("claims_user",token);
                    }
                }catch(Exception e){
                    throw new RuntimeException("令牌不正确！");
                }
            }
        }
        return true;
    }

//    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
//    }
//
//    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
//    }
}
